// AC
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
using ll = long long;
const int mod = 998244353;

ll qpow(ll a, ll b) {
  ll res = 1;
  while (b) {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}

ll fac[2000005], inv[2000005];

void init() {
  fac[0] = 1;
  for (int i = 1; i <= 2000000; i++)
    fac[i] = fac[i - 1] * i % mod;
  inv[2000000] = qpow(fac[2000000], mod - 2);
  for (int i = 1999999; i >= 0; i--)
    inv[i] = inv[i + 1] * (i + 1) % mod;
}

ll getC(int n, int m) {
  if (m < 0 || m > n)
    return 0;
  return fac[n] * inv[m] % mod * inv[n - m] % mod;
}

int pre[128], suf[128];
// 记录当前前缀/后缀中各种字符出现次数

int main() {
  init();

  string s;
  cin >> s;

  ll ans = 0;

  // 初始化后缀统计
  for (char c : s)
    suf[c]++; // 先假设所有字符都在答案后半段

  for (char c : s) {
    // 当前字符c作为左半段的最后一个字符
    pre[c]++; // 将当前字符加入前缀统计
    suf[c]--; // 从后缀中移除当前字符

    // x: i的左侧与c相同的字符数量（包含c）
    int x = pre[c];
    // y: i的右侧与c+1相同的字符数量
    int y = suf[c + 1];

    // 根据范德蒙德恒等式，结果为C(x+y-1, x)
    ans = (ans + getC(x + y - 1, x)) % mod;
  }
  cout << ans;
  return 0;
}